﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using BLL;
using Exceptions;
using BTO;

namespace CentralReserva
{
    public class MenuTiposTransporte
    {
        private static int opcao = 0;

        public static void menuTiposTransporte()
        {
            do
            {
                Console.WriteLine("Menu Tipos de Transporte: Escolha uma das opçoes disponiveis.\n\n");
                Console.WriteLine(" 1 - Registar tipo de transporte - permite o registo de novos tipos;\n" +
                                  " 2 - Consultar tipo de transporte - consultar, editar e eliminar tipos;\n" +

                                  " 0 - Voltar ao menu principal;\n");

                string aux = Console.ReadLine();
                if (int.TryParse(aux, out opcao))
                {
                    Console.WriteLine("\n");
                    switch (opcao)
                    {
                        case 1:
                            Console.Clear();
                            registarTipoTransporte();
                            break;
                        case 2:
                            Console.Clear();
                            menuConsultarTiposTransporte();
                            break;
                        case 0:
                            Console.Clear();
                            MenuPrincipal.menuPrincipal();
                            break;
                        default:
                            Console.Clear();
                            Console.WriteLine("Introduza a uma opcao valida. [0-2]\n");
                            break;
                    }
                }
                else
                {
                    opcao = -1;
                    Console.Clear();
                    Console.WriteLine("Por favor introduza apenas numeros.\n");
                }
            } while (opcao != 0);
        }

        private static void registarTipoTransporte()
        {
            BTO.TipoTransporte tipo = new BTO.TipoTransporte();
            try
            {
                Console.Write("Descricao do tipo de transporte: ");
                string descricao = Console.ReadLine();

                Console.WriteLine("\nA escrever na base de dados. . . \n");

                tipo.descricao = descricao;

                BLLTipoTransporte novoTipo = new BLLTipoTransporte();

                novoTipo.insert(tipo);

                Console.WriteLine("Novo tipo de transporte registado com sucesso!\n");
            }
            catch (DescricaoTipoTransporteException e)
            {
                Console.WriteLine(e.Message + "\n");
                Console.Write("Pretende introduzir novamente? (y/n)\n ");
                string resposta = Console.ReadLine();
                if (resposta == "y" || resposta == "Y" || resposta == "yes" || resposta == "Yes")
                {
                    Console.Write("Introduza novamente a descricao:\n ");
                    string descricao = Console.ReadLine();
                    tipo.descricao = descricao;

                    Console.WriteLine("\nA escrever na base de dados. . . \n");
                    registarTipoTransporte(tipo);

                }
                else
                {
                    menuTiposTransporte();
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message + "\n");
            }

            menuTiposTransporte();
        }

        private static void registarTipoTransporte(BTO.TipoTransporte tipoTransporte)
        {
            try
            {
                BLLTipoTransporte novoTipo = new BLLTipoTransporte();
                novoTipo.insert(tipoTransporte);
            }
            catch (DescricaoTipoTransporteException e)
            {
                Console.WriteLine(e.Message + "\n");
                Console.Write("Pretende introduzir novamente? (y/n)\n ");
                string resposta = Console.ReadLine();
                if (resposta == "y" || resposta == "Y" || resposta == "yes" || resposta == "Yes")
                {
                    Console.Write("Introduza novamente a descricao:\n ");
                    string descricao = Console.ReadLine();
                    tipoTransporte.descricao = descricao;
                    registarTipoTransporte(tipoTransporte);
                    Console.WriteLine("Novo tipo de transporte registado com sucesso!\n");
                }
                else
                {
                    menuTiposTransporte();
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message + "\n");
            }

            menuTiposTransporte();
        }

        private static void menuConsultarTiposTransporte()
        {
            do
            {
                opcao = 0;
                Console.WriteLine("Menu de consulta e gestao de tipos de transporte, \nescolha uma das operacoes:\n\n");
                Console.WriteLine(" 1 - Listar todas os tipos registados;\n" +
                                  " 2 - Listar por id;\n" +
                                  " 3 - Listar por descricao;\n" +
                                  " 0 - Voltar ao Menu Tipos de Transporte;\n");

                string aux = Console.ReadLine();
                if (int.TryParse(aux, out opcao))
                {
                    Console.WriteLine("\n");
                    switch (opcao)
                    {
                        case 1:
                            Console.Clear();
                            listarTiposTransporte();
                            break;
                        case 2:
                            Console.Clear();
                            listarTiposTransportePorId();
                            break;
                        case 3:
                            Console.Clear();
                            listarTiposTransportePorDescricao();
                            break;
                        case 0:
                            Console.Clear();
                            menuTiposTransporte();
                            break;
                        default:
                            Console.WriteLine("Introduza a uma opcao valida. [0-3]\n");
                            break;
                    }
                }
                else
                {
                    opcao = -1;
                    Console.Clear();
                    Console.WriteLine("Por favor introduza apenas numeros.\n");
                }
            } while (opcao != 0);
        }

        private static void listarTiposTransporte()
        {

            Console.WriteLine("Lista dos tipos de transporte registados: \n\n");
            Console.WriteLine("A carregar lista . . .\n");
            BLLTipoTransporte tipoTransporte = new BLLTipoTransporte();
            try
            {
                List<BTO.TipoTransporte> listTipos = tipoTransporte.list();
                Console.WriteLine("Lista ok!\n\n");

                int counter = 1;
                foreach (BTO.TipoTransporte tipo in listTipos)
                {
                    Console.WriteLine("\n\n" + counter + ": ");
                    Console.WriteLine(tipo);
                    counter++;
                }
            }
            catch (NotFoundTipoTransporteException ex)
            {
                Console.WriteLine(ex.Message + "\n\n");
            }
            Console.WriteLine("\n\nQuando desejar pressione \"enter\" para voltar ao menu de gestao de tipos de transporte.");

            //Listener para averiguar se o utilizador pressiona enter
            ConsoleKeyInfo keyHit = new ConsoleKeyInfo();
            keyHit = Console.ReadKey(true);

            if (keyHit.Key == ConsoleKey.Enter) { Console.Clear(); menuConsultarTiposTransporte(); }
        }

        private static void listarTiposTransportePorId()
        {

            Console.WriteLine("Apos seleccionar o tipo de transporte, vai poder efectuar operacoes sobre o mesmo.\n");
            Console.Write("Introduza o id do tipo de transporte que procura: ");
            int id = -1;
            String aux = Console.ReadLine();

            if (int.TryParse(aux, out id))
            {
                Console.WriteLine("\nA procurar . . .\n");
                BLLTipoTransporte tipoTransporte = new BLLTipoTransporte();

                try
                {
                    Console.WriteLine(tipoTransporte.getByID(id));
                    Console.WriteLine("\n");
                    operarSobreTiposTransporte(tipoTransporte.getByID(id));
                    menuConsultarTiposTransporte();
                }
                catch (NotFoundTipoTransporteException ex)
                {

                    Console.WriteLine("\n" + ex.Message + " Por favor verifique o id do tipo de transporte e introduza novamente.\n\n");
                    Console.WriteLine("Prefere sair para o menu anterior? (y/n)");
                    string resposta = Console.ReadLine();
                    if (resposta == "y" || resposta == "Y" || resposta == "yes" || resposta == "Yes")
                    {
                        Console.Clear();
                        menuConsultarTiposTransporte();
                    }
                    else
                    {
                        Console.Clear();
                        listarTiposTransportePorId();
                    }
                }

            }
            else
            {
                Console.WriteLine("\nAtencao o id apenas pode conter numeros inteiros.\n");
                Console.WriteLine("\nPor favor volte a introduzir o id.\n\n\n");
                listarTiposTransportePorId();
            }

        }

        private static void listarTiposTransportePorDescricao()
        {

            Console.WriteLine("Apos seleccionar o tipo de transporte, vai poder efectuar operacoes sobre o mesmo.\n");
            Console.Write("Introduza a descricao do tipo de transporte que procura: ");
            String descricao = Console.ReadLine();
            Console.WriteLine("\nA procurar . . .\n");
            BLLTipoTransporte tipoTransporte = new BLLTipoTransporte();

            try
            {
                Console.WriteLine(tipoTransporte.getByDescricao(descricao));
                Console.WriteLine("\n");
                operarSobreTiposTransporte(tipoTransporte.getByDescricao(descricao));
                menuConsultarTiposTransporte();
            }
            catch (NotFoundTipoTransporteException ex)
            {

                Console.WriteLine("\n" + ex.Message + " Por favor verifique a descricao do tipo de transporte e introduza novamente.\n\n");
                Console.WriteLine("Prefere sair para o menu anterior? (y/n)");
                string resposta = Console.ReadLine();
                if (resposta == "y" || resposta == "Y" || resposta == "yes" || resposta == "Yes")
                {
                    Console.Clear();
                    menuConsultarTiposTransporte();
                }
                else
                {
                    Console.Clear();
                    listarTiposTransportePorDescricao();
                }
            }
        }

        private static void operarSobreTiposTransporte(BTO.TipoTransporte tipoTransporte)
        {
            do
            {
                opcao = 0;
                Console.WriteLine("Menu de gestao do tipo de transporte " + tipoTransporte.descricao + ", escolha uma das operacoes:\n\n");
                Console.WriteLine(" 1 - Editar informacoes do tipo de transporte;\n" +
                                  " 2 - Eliminar o tipo de transporte;\n" +
                                  " 0 - Voltar ao menu de consulta e gestao;\n");

                string aux = Console.ReadLine();
                if (int.TryParse(aux, out opcao))
                {
                    Console.WriteLine("\n");
                    switch (opcao)
                    {
                        case 1:
                            Console.Clear();
                            actualizarTipoTransporte(tipoTransporte);
                            break;
                        case 2:
                            Console.Clear();
                            eliminarTipoTransporte(tipoTransporte);
                            break;
                        case 0:
                            Console.Clear();
                            menuConsultarTiposTransporte();
                            break;
                        default:
                            Console.WriteLine("Introduza a uma opcao valida. [0-2]\n");
                            break;
                    }
                }
                else
                {
                    opcao = -1;
                    Console.Clear();
                    Console.WriteLine("Por favor introduza apenas numeros.\n");
                }
            } while (opcao != 0);
        }

        private static void actualizarTipoTransporte(BTO.TipoTransporte toUpdate)
        {
            Console.WriteLine("Edicao e actualizacao dos dados do tipo de transporte " + toUpdate.descricao + ".\n");
            Console.WriteLine("A esquerda é fornecida a informacao actual;");
            Console.WriteLine("Do lado direito pode editar a informacao, ou manter a antiga.\n\n");

            BLLTipoTransporte tipoTransporte = new BLLTipoTransporte();
            BTO.TipoTransporte oldTipoTransporte = toUpdate;
            BTO.TipoTransporte newTipoTransporte = new BTO.TipoTransporte();

            newTipoTransporte.IDTipoTransporte = oldTipoTransporte.IDTipoTransporte;

            Console.Write("Descricao (" + oldTipoTransporte.descricao + "): ");
            string newDescricao = Console.ReadLine();
            if (newDescricao == "")
                newTipoTransporte.descricao = oldTipoTransporte.descricao;
            else
                newTipoTransporte.descricao = newDescricao;

            try
            {
                Console.WriteLine("Tem a certeza que pretende alterar o registo do tipo de transporte " + oldTipoTransporte.descricao + "? (y/n)");
                string resposta = Console.ReadLine();
                if (resposta == "y" || resposta == "Y" || resposta == "yes" || resposta == "Yes")
                {
                    Console.WriteLine("\nA alterar . . .\n");
                    tipoTransporte.update(newTipoTransporte);
                    Console.WriteLine("Dados do tipo de transporte alterados com sucesso!\n\n");
                    operarSobreTiposTransporte(newTipoTransporte);
                }
            }
            catch (Exception e) { Console.WriteLine(e.Message); Console.WriteLine(newTipoTransporte); operarSobreTiposTransporte(oldTipoTransporte); }
            operarSobreTiposTransporte(oldTipoTransporte);
        }

        private static void eliminarTipoTransporte(BTO.TipoTransporte toDelete)
        {
            Console.WriteLine("Tem a certeza que pretende eliminar o registo do tipo de transporte " + toDelete.descricao + "? (y/n)");
            string resposta = Console.ReadLine();
            if (resposta == "y" || resposta == "Y" || resposta == "yes" || resposta == "Yes")
            {
                Console.WriteLine("\nA eliminar . . .\n");
                BLLTipoTransporte tipoTransporte = new BLLTipoTransporte();
                tipoTransporte.delete(toDelete.IDTipoTransporte);
                Console.WriteLine("Tipo de transporte eliminado com sucesso!\n\n");
                menuConsultarTiposTransporte();
            }
            operarSobreTiposTransporte(toDelete);
        }
    }
}
